object Demo11Func4 {
  // 以函数作为返回值
  // 将函数作为返回值时 返回值的类型得手动指定
  def func1(str1: String): Int => Int = {
    println("func1被调用")

    // Int => Int
    def func1_1(int: Int): Int = {
      println("func1_1被调用")
      str1.toInt + int
    }

    func1_1
  }

  // 简化定义
  // 将函数作为返回值时 返回值的类型得手动指定
  // 函数的柯里化：将有N个参数的函数变成了N个只有一个参数的函数
  def func2(str1: String)(int: Int): Int = {
    str1.toInt + int
  }

  // 不使用函数最为返回值
  def func3(str1: String, int: Int): Int = {
    str1.toInt + int
  }


  // 计算 a的b次方 ，如果不给定b，则计算a的3次方
  // 第一种方式：使用默认参数
  def aPowerB(a: Int, b: Int = 3): Unit = {
    println(Math.pow(a, b))
  }


  // 第二种方式：使用函数式编程的思想
  def aPowerB2(a: Int)(b: Int): Unit = {
    println(Math.pow(b, a))
  }

  def main(args: Array[String]): Unit = {
    val func1_1: Int => Int = func1("100")
    val i: Int = func1_1(200)
    println(i)
    // 简化调用
    println(func1("100")(200))
    println(func2("100")(200))
    println(func3("100", 200))

    aPowerB(2, 2)
    aPowerB(2, 3)
    aPowerB(2, 4)
    aPowerB(2)

    // 偏应用函数：将有N个参数函数 变成N-X个参数的函数 X表示已经固定的参数
    val aPower3: Int => Unit = aPowerB2(3)
    aPower3(2)
    aPower3(3)
    aPower3(4)

    aPowerB2(4)(2)

  }

}
